{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-03-01T11:31:19.720003Z",
     "start_time": "2022-03-01T11:31:18.356798Z"
    },
    "id": "oeNsjVdFvEuq"
   },
   "outputs": [],
   "source": [
    "# Подгрузим пакеты\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy import stats\n",
    "matplotlib.style.use('ggplot')\n",
    "%matplotlib inline\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NV3PleogvEu6"
   },
   "source": [
    "# Покемоны и A/B-тестирование\n",
    "(Реальный кейс собеседования на позицию аналитика)\n",
    "\n",
    "\n",
    "# Описание задачи\n",
    "\n",
    "![banner](https://storage.googleapis.com/kaggle-datasets-images/635/1204/126be74882028aac7241553cef0e27a7/dataset-original.jpg)\n",
    "\n",
    "Покемоны — это маленькие существа, которые сражаются друг с другом на соревнованиях. Все покемоны имеют разные характеристики (сила атаки, защиты и т. д.) и относятся к одному или двум так называемым классам (вода, огонь и т. д.).\n",
    "Профессор Оук изобрёл Pokédex, портативное устройство, которое хранит информацию обо всех существующих покемонах. Как его ведущий специалист по данным, вы только что получили от него запрос с просьбой осуществить аналитику данных на всех устройствах Pokédex.\n",
    "\n",
    "## Описание набора данных\n",
    "Профессор Оук скопировал всё содержимое памяти одного устройства Pokédex, в результате чего получился набор данных, с которым вы будете работать в этой задаче. В этом файле каждая строка представляет характеристики одного покемона:\n",
    "\n",
    "* `pid`: Numeric — ID покемона\n",
    "* `HP`: Numeric — очки здоровья\n",
    "* `Attack`: Numeric — сила обычной атаки\n",
    "* `Defense`: Numeric — сила обычной защиты\n",
    "* `Sp. Atk`: Numeric — сила специальной атаки\n",
    "* `Sp. Def`: Numeric — сила специальной защиты\n",
    "* `Speed`: Numeric — скорость движений\n",
    "* `Legendary`: Boolean — True, если покемон редкий\n",
    "* `Class 1`: Categorical — класс покемона\n",
    "* `Class 2`: Categorical — класс покемона"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!-- тест dataframe -->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "test dataframe\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(r\"https://gist.githubusercontent.com/armgilles/194bcff35001e7eb53a2a8b441e8b2c6/raw/92200bc0a673d5ce2110aaad4544ed6c4010f687/pokemon.csv\", on_bad_lines=\"skip\")\n",
    "pokemon = df.copy(deep=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "pokemon = pokemon.rename(columns={\"Type 1\":\"Class 1\", \"Type 2\":\"Class 2\" }).drop(columns=['Total', 'Generation'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-03-01T11:32:33.039545Z",
     "start_time": "2022-03-01T11:32:33.004532Z"
    },
    "id": "OeyXBUB7vEu7",
    "outputId": "7e913771-8e46-4741-9473-3503850647eb"
   },
   "outputs": [],
   "source": [
    "# pokemon = pd.read_csv('pokemon.csv', error_bad_lines=False)  # Откроем датасет\n",
    "# pokemon.head()\n",
    "\n",
    "\n",
    "# Обратите внимание: у покемона может быть один или два класса\n",
    "# Если у покемона два класса, считается, что они имеют одинаковую значимость"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "b-lGrHLnvEu7"
   },
   "source": [
    "# Задачи"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wbeiznwcvEu7"
   },
   "source": [
    "<div class=\"alert alert-info\">\n",
    "<b>Задание №1</b>\n",
    "    \n",
    "Профессор Оук подозревает, что у покемонов в классе `grass` более сильная обычная атака, чем у покемонов в классе `rock`. Проверьте, прав ли он, и статистически убедите его в своём выводе.\n",
    "    \n",
    "    \n",
    "Примечание: если есть покемоны, которые относятся к обоим классам, отбросьте их.\n",
    "    \n",
    "Вы можете предположить, что распределение обычных атак является нормальным для всех классов покемонов.\n",
    "\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# убираем покемонов, которые относятся к обоим классам\n",
    "pokemon_t1 = pokemon.loc[ \n",
    "    (\n",
    "        ((pokemon['Class 1'] == 'Grass') & (pokemon['Class 2'] == 'Rock')) | \n",
    "        ((pokemon['Class 2'] == 'Grass') & (pokemon['Class 1'] == 'Rock')) \n",
    "    ) == False\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# здесь покемоны с классом Grass\n",
    "pokemon_grass = pokemon_t1.loc[ \n",
    "    (\n",
    "    (pokemon['Class 1'] == 'Grass') | (pokemon['Class 2'] == 'Grass')\n",
    "    )\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# здесь покемоны с классом Rock\n",
    "pokemon_rock = pokemon_t1.loc[ \n",
    "    (\n",
    "    (pokemon['Class 1'] == 'Rock') | (pokemon['Class 2'] == 'Rock')\n",
    "    )\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "В среднем обычные атаки класса Rock сильнее класса Grass на 18.054531490015364\n"
     ]
    }
   ],
   "source": [
    "# обычное сравнение средних\n",
    "diff = pokemon_grass.Attack.mean() - pokemon_rock.Attack.mean() \n",
    "if diff > 0:\n",
    "    print('В среднем обычные атаки класса Grass сильнее класса Rock на ' + str(abs(diff)))\n",
    "else:\n",
    "    print('В среднем обычные атаки класса Rock сильнее класса Grass на ' + str(abs(diff)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# t-test для проверки статистической значимости отличий\n",
    "t_stat, p = stats.ttest_ind(a = pokemon_grass.Attack,\n",
    "                b = pokemon_rock.Attack)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "T-Test подтвердил, что отличия имеют значимость\n"
     ]
    }
   ],
   "source": [
    "# Принимаем решение на основе p-значения\n",
    "alpha = 0.05 # уровень значимости\n",
    "if p < alpha:\n",
    "    print(\"T-Test подтвердил, что отличия имеют значимость\")\n",
    "else:\n",
    "    print(\"T-Test не подтвердил, что отличия имеют значимость\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вывод: Гипотеза профессора не верна т.к. в среднем обычные атаки класса Rock сильнее класса Grass\n"
     ]
    }
   ],
   "source": [
    "print('Вывод: Гипотеза профессора не верна т.к. в среднем обычные атаки класса Rock сильнее класса Grass')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s6-AQUMnvEu7"
   },
   "source": [
    "<div class=\"alert alert-info\">\n",
    "<b>Задание №2</b>\n",
    "    \n",
    "Профессор Оук уже долго не может спать по ночам, ведь его волнует вопрос, правда ли, что покемоны в классе `Water` в среднем быстрее, чем покемоны в классе `Normal`.\n",
    "    \n",
    "    \n",
    "Проверьте, прав ли он, и убедите его в своём выводе статистически.\n",
    "    \n",
    "Примечание: если есть покемоны, которые относятся к обоим классам, отбросьте их.\n",
    "    \n",
    "Вы можете предположить, что распределение скорости движения является нормальным для всех классов покемонов.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# убираем покемонов, которые относятся к обоим классам\n",
    "pokemon_t2 = pokemon.loc[ \n",
    "    (\n",
    "        ((pokemon['Class 1'] == 'Water') & (pokemon['Class 2'] == 'Normal')) | \n",
    "        ((pokemon['Class 2'] == 'Water') & (pokemon['Class 1'] == 'Normal')) \n",
    "    ) == False\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# здесь покемоны с классом Grass\n",
    "pokemon_water = pokemon_t2.loc[ \n",
    "    (\n",
    "    (pokemon['Class 1'] == 'Water') | (pokemon['Class 2'] == 'Water')\n",
    "    )\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# здесь покемоны с классом Grass\n",
    "pokemon_normal = pokemon_t2.loc[ \n",
    "    (\n",
    "    (pokemon['Class 1'] == 'Normal') | (pokemon['Class 2'] == 'Normal')\n",
    "    )\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "В среднем класс Normal быстрее класса Water на 7.321425742574249\n"
     ]
    }
   ],
   "source": [
    "# обычное сравнение средних\n",
    "diff_t2 = pokemon_water.Speed.mean() - pokemon_normal.Speed.mean() \n",
    "\n",
    "if diff_t2 > 0:\n",
    "    print('В среднем класс Water быстрее класса Normal на ' + str(abs(diff_t2)))\n",
    "else:\n",
    "    print('В среднем класс Normal быстрее класса Water на ' + str(abs(diff_t2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# t-test для проверки статистической значимости отличий\n",
    "t_stat_2, p_2 = stats.ttest_ind(a = pokemon_water.Speed,\n",
    "                b = pokemon_normal.Speed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "T-Test подтвердил, что отличия имеют значимость\n"
     ]
    }
   ],
   "source": [
    "# Принимаем решение на основе p-значения\n",
    "alpha = 0.05 # уровень значимости\n",
    "if p_2 < alpha:\n",
    "    print(\"T-Test подтвердил, что отличия имеют значимость\")\n",
    "else:\n",
    "    print(\"T-Test не подтвердил, что отличия имеют значимость\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вывод: Гипотеза профессора не верна, т.к. в среднем класс Normal быстрее и t-test это подтверждает\n"
     ]
    }
   ],
   "source": [
    "print('Вывод: Гипотеза профессора не верна, т.к. в среднем класс Normal быстрее и t-test это подтверждает')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "QYcX1Nc2vEu7"
   },
   "source": [
    "<div class=\"alert alert-info\">\n",
    "<b>Задание №3</b>\n",
    "    \n",
    "Профессор Оук тот ещё безумец. Он изобрел сыворотку, способную ускорить покемона. Но мы усомнились в эффективности его вакцины. Профессор дал эту сыворотку следующим покемонам: см. массив `treathed_pokemon`. Проверьте, работает ли его сыворотка вообще, и убедите всех в своём выводе статистически.\n",
    "    \n",
    "    \n",
    "Вы можете предположить, что распределение скорости движения является нормальным для всех классов покемонов.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-03-01T11:32:33.055532Z",
     "start_time": "2022-03-01T11:32:33.044535Z"
    },
    "id": "j5JfrCW7vEu7"
   },
   "outputs": [],
   "source": [
    "# Покемоны, которые принимали сыворотку для увеличения скорости\n",
    "treathed_pokemon = ['Mega Beedrill', 'Mega Alakazam',\n",
    "                    'Deoxys Normal Forme', 'Mega Lopunny']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "pokemon.loc[pokemon.Name.str.match('.*Mega Beedrill.*'), 'Name'] = 'Mega Beedrill'\n",
    "pokemon.loc[pokemon.Name.str.match('.*Mega Alakazam.*'), 'Name'] = 'Mega Alakazam'\n",
    "pokemon.loc[pokemon.Name.str.match('.*DeoxysNormal Forme.*'), 'Name'] = 'Deoxys Normal Forme'\n",
    "pokemon.loc[pokemon.Name.str.match('.*Mega Lopunny.*'), 'Name'] = 'Mega Lopunny'\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "Eo3Uos7jvEu7"
   },
   "outputs": [],
   "source": [
    "# отделяем покемонов с сывороткой и без неё\n",
    "pokemon_with_serum = pokemon.loc[pokemon.Name.isin(treathed_pokemon)]\n",
    "pokemon_no_serum = pokemon.loc[~pokemon.Name.isin(treathed_pokemon)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# используем критерий Манна-Уитни, т.к. t-test из-за малого размера выборки не подходит\n",
    "t, p_3 = stats.mannwhitneyu(pokemon_with_serum.Speed, pokemon_no_serum.Speed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отклоняем нулевую гипотезу: Сыворотка значимо влияет на скорость покемонов.\n"
     ]
    }
   ],
   "source": [
    "# Сравнение с уровнем значимости 0.05\n",
    "if p_3 < 0.05:\n",
    "    print(\"Отклоняем нулевую гипотезу: Сыворотка значимо влияет на скорость покемонов.\")\n",
    "else:\n",
    "    print(\"Не отклоняем нулевую гипотезу: Нет оснований считать, что сыворотка влияет на скорость покемонов.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вывод: Статистический метод Критерий Манна Уитни говорит о наличии статистической значимости сыворотки профессора.\n"
     ]
    }
   ],
   "source": [
    "print('Вывод: Статистический метод Критерий Манна Уитни говорит о наличии статистической значимости сыворотки профессора.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tZBFs2mwvEu7"
   },
   "source": [
    "<div class=\"alert alert-info\">\n",
    "<b>Задание №4</b>\n",
    "    \n",
    "Профессор Оук всегда любил истории о легендарных покемонах. Но профессор не очень уверен, что они лучшие из всех покемонов. Оук предложил нам в этом разобраться. Проверьте, действительно ли сумма характеристик `HP`,`Attack`,`Defense` у легендарных покемонов выше, чем у других покемонов. А произведение этих же параметров? Найдите ответы на эти вопросы и убедите всех в своём выводе статистически.\n",
    "   \n",
    "\n",
    "Вы можете предположить, что распределение сумм и произведений этих параметров является нормальным для всех классов покемонов.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "id": "DJPV17iIvEu7"
   },
   "outputs": [],
   "source": [
    "pokemon_t4 = pokemon.copy(deep=True)\n",
    "\n",
    "pokemon_t4['sum_key_skills'] = pokemon_t4.HP + pokemon_t4.Attack + pokemon_t4.Defense\n",
    "pokemon_t4['product_key_skills'] = pokemon_t4.HP * pokemon_t4.Attack * pokemon_t4.Defense\n",
    "\n",
    "legendary_pokemons = pokemon_t4.loc[pokemon_t4.Legendary == True]\n",
    "non_legendary_pokemons = pokemon_t4.loc[pokemon_t4.Legendary == False]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "В среднем сумма ключевых показателей Legendary Pokemons больше на 94.6660387231816\n"
     ]
    }
   ],
   "source": [
    "# обычное сравнение средних\n",
    "diff_t4 = legendary_pokemons.sum_key_skills.mean() - non_legendary_pokemons.sum_key_skills.mean()\n",
    "\n",
    "if diff_t4 > 0:\n",
    "    print('В среднем сумма ключевых показателей Legendary Pokemons больше на ' + str(abs(diff_t4)))\n",
    "else:\n",
    "    print('В среднем сумма ключевых показателей Legendary Pokemons меньше на ' + str(abs(diff_t4)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "# t-test для проверки статистической значимости отличий\n",
    "t_stat_4, p_4 = stats.ttest_ind(a = legendary_pokemons.sum_key_skills,\n",
    "                b = non_legendary_pokemons.sum_key_skills)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отклоняем нулевую гипотезу: Сумма ключевых показателей редких покемонов значимо отличается от обычных\n"
     ]
    }
   ],
   "source": [
    "# Сравнение с уровнем значимости 0.05\n",
    "if p_4 < 0.05:\n",
    "    print(\"Отклоняем нулевую гипотезу: Сумма ключевых показателей редких покемонов значимо отличается от обычных\")\n",
    "else:\n",
    "    print(\"Не отклоняем нулевую гипотезу: Нет оснований считать, что сумма ключевых показателей редких покемонов значимо отличается от обычных\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "В среднем произведение ключевых показателей Legendary Pokemons больше на 660900.2262689692\n"
     ]
    }
   ],
   "source": [
    "# обычное сравнение средних\n",
    "diff_t4_1 = legendary_pokemons.product_key_skills.mean() - non_legendary_pokemons.product_key_skills.mean()\n",
    "\n",
    "if diff_t4_1 > 0:\n",
    "    print('В среднем произведение ключевых показателей Legendary Pokemons больше на ' + str(abs(diff_t4_1)))\n",
    "else:\n",
    "    print('В среднем произведение ключевых показателей Legendary Pokemons меньше на ' + str(abs(diff_t4_1)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# t-test для проверки статистической значимости отличий\n",
    "t_stat_4_1, p_4_1 = stats.ttest_ind(a = legendary_pokemons.product_key_skills,\n",
    "                b = non_legendary_pokemons.product_key_skills)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отклоняем нулевую гипотезу: Произведение ключевых показателей редких покемонов значимо отличается от обычных\n"
     ]
    }
   ],
   "source": [
    "# Сравнение с уровнем значимости 0.05\n",
    "if p_4_1 < 0.05:\n",
    "    print(\"Отклоняем нулевую гипотезу: Произведение ключевых показателей редких покемонов значимо отличается от обычных\")\n",
    "else:\n",
    "    print(\"Не отклоняем нулевую гипотезу: Нет оснований считать, что произведение ключевых показателей редких покемонов значимо отличается от обычных\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вывод: Сумма ключевых показателей редких покемонов выше, t-test показал статистическую значимость (p-value = 7.970942205722087e-29 )\n",
      "Вывод: Произведение ключевых показателей редких покемонов выше, t-test показал статистическую значимость (p-value = 1.992664308842282e-36 )\n"
     ]
    }
   ],
   "source": [
    "print('Вывод: Сумма ключевых показателей редких покемонов выше, t-test показал статистическую значимость (p-value = ' + str(p_4) + ' )')\n",
    "print('Вывод: Произведение ключевых показателей редких покемонов выше, t-test показал статистическую значимость (p-value = ' + str(p_4_1) + ' )')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "QuBs5cbEvEu7"
   },
   "source": [
    "<div class=\"alert alert-info\">\n",
    "<b>Задание №5</b>\n",
    "    \n",
    "Профессор Оук частенько наблюдает за боями покемонов. После очередных таких боёв Оук выделил три класса `best_defence_class`, которые, на его взгляд, одинаковы по силе обычной защиты `Defense`. Проверьте, действительно ли эти классы покемонов не отличаются по уровню защиты статистически значимо. Всё та же статистика вам в помощь!\n",
    "   \n",
    "\n",
    "Вы можете предположить, что распределение сумм и произведений этих параметров является нормальным для всех классов покемонов.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-03-01T11:32:33.070533Z",
     "start_time": "2022-03-01T11:32:33.060532Z"
    },
    "id": "uN1x6XMUvEu7",
    "outputId": "ef6dd65f-b4d1-4f0f-b985-6b5e6701a32e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Rock', 'Ground', 'Steel', 'Ice']"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "best_defence_class = ['Rock', 'Ground', 'Steel', 'Ice']\n",
    "best_defence_class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "groups = []\n",
    "for i in best_defence_class:\n",
    "    exec(f\"pokemon_{i.lower()} = pokemon.loc[(pokemon['Class 1'] == '{i}' ) | (pokemon['Class 2'] == '{i}')]\")\n",
    "    exec(f\"groups.append(pokemon_{i.lower()}.Defense)\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "id": "NCGqpymVvEu8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "P-value для теста между группой 0 и 1: 0.005360003005809172\n",
      "P-value для теста между группой 0 и 2: 0.2080179804800012\n",
      "P-value для теста между группой 0 и 3: 0.00014368052111538647\n",
      "P-value для теста между группой 1 и 2: 0.00011323306734870683\n",
      "P-value для теста между группой 1 и 3: 0.14053946217093283\n",
      "P-value для теста между группой 2 и 3: 3.266802504855092e-06\n",
      "Есть 4 статистически значимых различий между группами.\n"
     ]
    }
   ],
   "source": [
    "# Проведение множественных t-тестов\n",
    "p_values = {}\n",
    "\n",
    "for i in range(len(groups)):\n",
    "    for j in range(i+1, len(groups)):\n",
    "        stat, p_val = stats.ttest_ind(groups[i], groups[j])\n",
    "        exec(f\"p_values['{i} и {j}'] = {p_val}\")\n",
    "\n",
    "# Вывод результатов\n",
    "for i, p_val in enumerate(p_values):\n",
    "    print(f\"P-value для теста между группой {p_val}: {p_values[p_val]}\")\n",
    "\n",
    "# Сравнение каждого p-value с уровнем значимости (например, 0.05)\n",
    "significant_tests = sum(1 for p_val in p_values if p_values[p_val] < 0.05)\n",
    "if significant_tests > 0:\n",
    "    print(f\"Есть {significant_tests} статистически значимых различий между группами.\")\n",
    "else:\n",
    "    print(\"Нет статистически значимых различий между группами.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вывод: эти классы Rock, Ground, Steel, Ice отличаются по уровню защиты\n"
     ]
    }
   ],
   "source": [
    "print('Вывод: эти классы Rock, Ground, Steel, Ice отличаются по уровню защиты')"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
